home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / wsc4c21.zip / MODEM.C < prev    next >
C/C++ Source or Header  |  1997-05-22  |  12KB  |  436 lines

  1. /*
  2. **  MODEM.C
  3. **
  4. **  Modem exerciser example program.
  5. */
  6.  
  7. #define USECOMM
  8.  
  9. #include <windows.h>
  10.  
  11. #ifdef WIN32
  12. #define USE_INS HINSTANCE
  13. #define USE_PTR PSTR
  14. #else
  15. #define USE_INS HANDLE
  16. #define USE_PTR LPSTR
  17. #endif
  18.  
  19. #include "modem.h"
  20. #include "message.h"
  21. #include "wsc.h"
  22. #include "ascii.h"
  23. #include "config.h"
  24. #include "paint.h"
  25. #include "line.h"
  26. #include "menu.h"
  27. #include "about.h"
  28. #include "sioerror.h"
  29.  
  30. #define MENU_BAR_CHANGE 1
  31.  
  32. /* public globals */
  33. HWND hMainWnd;            /* main window handle */
  34. HWND hInfoWnd;            /* popup handle */
  35. USE_INS hInstance;         /* program instance */
  36. int OnLineFlag = FALSE;   /* TRUE: online */
  37. int FatalFlag = FALSE;    /* TRUE: fatal error */
  38. char *Alpha = "TestABCDEFGHIJKLMNOPQRSTUVWXYZ\r\n";
  39. char Temp[1024];
  40.  
  41. /* private globals */
  42.  
  43. static int WinWidth = 8 * NCOLS;
  44. static int WinHeight = 12 * NROWS + 48;
  45.  
  46. /* miscellaneous functions */
  47.  
  48. void ErrorCheck(int);
  49. void ErrorMessage(char *);
  50.  
  51. #ifdef WIN32
  52. int WINAPI
  53. #else
  54. int PASCAL
  55. #endif
  56. WinMain(USE_INS hInst,USE_INS hPrevInstance,USE_PTR lpCmdLine,int nCmdShow)
  57. {WNDCLASS  wc;
  58.  MSG msg;
  59.  BOOL Result;
  60.  if(!hPrevInstance)
  61.    {/* register main window class */
  62.     wc.style = CS_HREDRAW | CS_VREDRAW;
  63.     wc.lpfnWndProc = MainWndProc;
  64.     wc.cbClsExtra = 0;
  65.     wc.cbWndExtra = 0;
  66.     wc.hInstance = hInst;
  67.     wc.hIcon = LoadIcon(hInst, "ModemIcon");
  68.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  69.     wc.hbrBackground = (HBRUSH) GetStockObject(WHITE_BRUSH);
  70.     wc.lpszMenuName =  "ModemMenu";
  71.     wc.lpszClassName = "ModemWClass";
  72.     Result = RegisterClass(&wc);
  73.     if(!Result) return FALSE;
  74.    }
  75.  
  76.  /* create main window */
  77.  hInstance = hInst;
  78.  hMainWnd = CreateWindow(
  79.         "ModemWClass",   "Modem",       WS_OVERLAPPEDWINDOW,
  80.         CW_USEDEFAULT,    CW_USEDEFAULT,
  81.         WinWidth,         WinHeight,
  82.         NULL,             NULL,
  83.         hInstance,        NULL);
  84.  ShowWindow(hMainWnd, nCmdShow);
  85.  UpdateWindow(hMainWnd);
  86.  
  87.  /* window control loop */
  88.  
  89.  while(GetMessage(&msg,NULL,0,0))
  90.    {
  91.     TranslateMessage(&msg);
  92.     DispatchMessage(&msg);
  93.    }
  94.  return (msg.wParam);
  95. } /* end WinMain */
  96.  
  97. #ifdef WIN32
  98. LRESULT CALLBACK
  99. #else
  100. long FAR PASCAL
  101. #endif
  102. MainWndProc(HWND hWindow,UINT iMsg,WPARAM wParam,LPARAM lParam)
  103. {int  i, n;
  104.  int  Count;
  105.  int  StatusWord;
  106.  HDC  hDC;
  107.  UINT idTimer;
  108.  PAINTSTRUCT ps;
  109. #ifdef WIN32
  110. #else
  111.  static FARPROC lpfnAboutDlgProc;
  112. #endif
  113.  static int ThePort;
  114.  
  115.  hMainWnd = hWindow;
  116.  switch (iMsg)
  117.     {case WM_COMMAND:
  118.        switch(wParam)
  119.           {case MSG_ABOUT:
  120. #ifdef WIN32
  121.               DialogBox(hInstance,"AboutBox",hMainWnd,AboutDlgProc);
  122. #else
  123.               DialogBox(hInstance,"AboutBox",hMainWnd,lpfnAboutDlgProc);
  124. #endif
  125.               break;
  126.  
  127.             case MSG_DEBUG:
  128.               break;
  129.  
  130.             case MSG_TEST:
  131.               DisplayLine("Sending test string 'TestABCD...XYZ' 32 times");
  132.               for(i=0;i<32;i++) SioPuts(ThePort,Alpha,32);
  133.               break;
  134.  
  135.             case MSG_ONLINE:
  136.               if(FatalFlag) ErrorMessage("Fatal Error");
  137.               else
  138.                 {/* try to go on-line */
  139.                  ThePort = GetPort();
  140.                  GoOnLine(ThePort,GetBaud(),1024,512);
  141.                  SetTitle();
  142.                  /* update menu settings */
  143.                  CheckTheMenu(MSG_DTR_SET);
  144.                  CheckTheMenu(MSG_RTS_SET);
  145.                  UncheckTheMenu(MSG_HW_FLOW);
  146.                  UncheckTheMenu(MSG_SW_FLOW);
  147.                  CheckTheMenu(MSG_NO_FLOW);
  148.                  CheckTheMenu(MSG_ONLINE);
  149.                  UncheckTheMenu(MSG_OFFLINE);
  150.                  EnableTheMenu(MSG_OFFLINE);
  151.                  DisableTheMenu(MSG_ONLINE);
  152.                  DisableMenuBarItem(MENU_BAR_CHANGE);
  153.                  for(i=2;i<=5;i++) EnableMenuBarItem(i);
  154.                  DrawMenuBar(hMainWnd);
  155.                  if(!OnLineFlag) break;
  156.                 }
  157.               break;
  158.  
  159.             case MSG_OFFLINE:
  160.               GoOffLine(ThePort);
  161.               SetTitle();
  162.               /* update menu settings */
  163.               CheckTheMenu(MSG_OFFLINE);
  164.               UncheckTheMenu(MSG_ONLINE);
  165.               EnableTheMenu(MSG_ONLINE);
  166.               DisableTheMenu(MSG_OFFLINE);
  167.               EnableMenuBarItem(MENU_BAR_CHANGE);
  168.               for(i=2;i<=5;i++) DisableMenuBarItem(i);
  169.               DrawMenuBar(hMainWnd);
  170.               break;
  171.  
  172.             case MSG_EXIT:
  173.               GoOffLine(ThePort);
  174.               KillTimer(hMainWnd,idTimer);
  175.               PostQuitMessage(0);
  176.               break;
  177.  
  178.             case MSG_110:
  179.               SetBaud(Baud110);
  180.               break;
  181.  
  182.             case MSG_300:
  183.               SetBaud(Baud300);
  184.               break;
  185.  
  186.             case MSG_1200:
  187.               SetBaud(Baud1200);
  188.               break;
  189.  
  190.             case MSG_2400:
  191.               SetBaud(Baud2400);
  192.               break;
  193.  
  194.             case MSG_4800:
  195.               SetBaud(Baud4800);
  196.               break;
  197.  
  198.             case MSG_9600:
  199.               SetBaud(Baud9600);
  200.               break;
  201.  
  202.             case MSG_19200:
  203.               SetBaud(Baud19200);
  204.               break;
  205.  
  206.             case MSG_38400:
  207.               SetBaud(Baud38400);
  208.               break;
  209.  
  210.             case MSG_57600:
  211.               SetBaud(Baud57600);
  212.               break;
  213.  
  214.             case MSG_COM1:
  215.               SetThePort(COM1);
  216.               break;
  217.  
  218.             case MSG_COM2:
  219.               SetThePort(COM2);
  220.               break;
  221.  
  222.             case MSG_COM3:
  223.               SetThePort(COM3);
  224.               break;
  225.  
  226.             case MSG_COM4:
  227.               SetThePort(COM4);
  228.               break;
  229.  
  230.             case MSG_NONE:
  231.               SetParity(NoParity);
  232.               break;
  233.  
  234.             case MSG_EVEN:
  235.               SetParity(EvenParity);
  236.               break;
  237.  
  238.             case MSG_ODD:
  239.               SetParity(OddParity);
  240.               break;
  241.  
  242.             case MSG_1_SB:
  243.               SetStopBits(OneStopBit);
  244.               break;
  245.  
  246.             case MSG_2_SB:
  247.               SetStopBits(TwoStopBits);
  248.               break;
  249.  
  250.             case MSG_7_DB:
  251.               SetWordLength(WordLength7);
  252.               break;
  253.  
  254.             case MSG_8_DB:
  255.               SetWordLength(WordLength8);
  256.               break;
  257.  
  258.             case MSG_DTR_SET:
  259.               SioDTR(ThePort,'S');
  260.               CheckTheMenu(MSG_DTR_SET);
  261.               UncheckTheMenu(MSG_DTR_CLR);
  262.               break;
  263.  
  264.             case MSG_DTR_CLR:
  265.               SioDTR(ThePort,'C');
  266.               CheckTheMenu(MSG_DTR_CLR);
  267.               UncheckTheMenu(MSG_DTR_SET);
  268.               break;
  269.  
  270.             case MSG_RTS_SET:
  271.               SioRTS(ThePort,'S');
  272.               CheckTheMenu(MSG_RTS_SET);
  273.               UncheckTheMenu(MSG_RTS_CLR);
  274.               break;
  275.  
  276.             case MSG_RTS_CLR:
  277.               SioRTS(ThePort,'C');
  278.               CheckTheMenu(MSG_RTS_CLR);
  279.               UncheckTheMenu(MSG_RTS_SET);
  280.               break;
  281.  
  282.             case MSG_HW_FLOW:
  283.               SioFlow(ThePort,'H');
  284.               CheckTheMenu(MSG_HW_FLOW);
  285.               UncheckTheMenu(MSG_SW_FLOW);
  286.               UncheckTheMenu(MSG_NO_FLOW);
  287.               break;
  288.  
  289.             case MSG_SW_FLOW:
  290.               SioFlow(ThePort,'S');
  291.               CheckTheMenu(MSG_SW_FLOW);
  292.               UncheckTheMenu(MSG_HW_FLOW);
  293.               UncheckTheMenu(MSG_NO_FLOW);
  294.               break;
  295.  
  296.             case MSG_NO_FLOW:
  297.               SioFlow(ThePort,'N');
  298.               CheckTheMenu(MSG_NO_FLOW);
  299.               UncheckTheMenu(MSG_HW_FLOW);
  300.               UncheckTheMenu(MSG_SW_FLOW);
  301.               break;
  302.  
  303.             case MSG_STATUS:
  304.  
  305.               StatusWord = SioStatus(ThePort, 0x0FFFF);
  306. #if 0
  307.               wsprintf((LPSTR)Temp,"Status = %xH", StatusWord);
  308.               DisplayLine(Temp);
  309. #endif
  310.               /* RX overflow ? */
  311.               if((WSC_RXOVER & StatusWord) != 0)
  312.                 DisplayLine("[Receive queue overflow]");
  313.               /* TX overflow */
  314.               if((WSC_TXFULL & StatusWord) != 0)
  315.                 DisplayLine("[Transmit queue overflow]");
  316.               /* Show RX queue size */
  317.               n = SioRxQue(ThePort);
  318.               if(n>0)
  319.                 {wsprintf((LPSTR)Temp,"[%d bytes in RX queue]",n);
  320.                  DisplayLine(Temp);
  321.                 }
  322.               /* Show TX queue size */
  323.               n = SioTxQue(ThePort);
  324.               if(n>0)
  325.                 {wsprintf((LPSTR)Temp,"[%d bytes in TX queue size]",n);
  326.                  DisplayLine(Temp);
  327.                 }
  328.               /* BREAK signal status */
  329.               if(SioBrkSig(ThePort, 'D') > 0) DisplayLine("[BREAK detected]");
  330.               /* DSR status */
  331.               if(SioDSR(ThePort) > 0) DisplayLine("[DSR set]");
  332.               else DisplayLine("[DSR clear]");
  333.               /* CTS status */
  334.               if(SioCTS(ThePort) > 0) DisplayLine("[CTS set]");
  335.               else DisplayLine("[CTS clear]");
  336.               /* DCD (Data Carrier Detect) status */
  337.               if(SioDCD(ThePort) > 0) DisplayLine("[DCD set]");
  338.               else DisplayLine("[DCD clear]");
  339.               break;
  340.  
  341.             default:
  342.               return (DefWindowProc(hMainWnd, iMsg, wParam, lParam));
  343.            }
  344.          break;
  345.  
  346.     case WM_CREATE:
  347.  
  348.       /* check "OFFLINE" menu item */
  349.       CheckTheMenu(MSG_OFFLINE);
  350.       DisableTheMenu(MSG_OFFLINE);
  351.       /* disable all but LINE & CHANGE */
  352.       for(i=2;i<=5;i++) DisableMenuBarItem(i);
  353. #ifdef WIN32
  354. #else
  355.       /* create AboutDlgProc() thunk */
  356.       lpfnAboutDlgProc = MakeProcInstance(AboutDlgProc, hInstance);
  357. #endif
  358.       /* initialize paint module */
  359.       PaintInit();
  360.       /* init configuration */
  361.       CheckAll();
  362.       CheckTheMenu(MSG_NO_FLOW);
  363.       UncheckTheMenu(MSG_HW_FLOW);
  364.       UncheckTheMenu(MSG_SW_FLOW);
  365.       SetText((LPSTR)"MODEM");
  366.       SetTitle();
  367.       /* start timer */
  368.       idTimer = SetTimer(hMainWnd,1,125,NULL);
  369.       if(idTimer==0)
  370.          {ErrorMessage("No timers remaining !");
  371.           FatalFlag = TRUE;
  372.          }
  373.       break;
  374.  
  375.     case WM_CHAR:
  376.       SioPutc(ThePort, (char)wParam );
  377.       break;
  378.  
  379.     case WM_TIMER:
  380.       /* fatal error ? */
  381.       if(FatalFlag) break;
  382.       if(!OnLineFlag) break;
  383.       /* fetch up to 1024 chars */
  384.       Count = SioGets(ThePort,Temp,1024);
  385.       if(Count>0) WriteTheString(Temp,Count);
  386.       break;
  387.  
  388.     case WM_SETFOCUS:
  389.       /* create client area caret */
  390.       CreateCaret(hMainWnd,NULL,3,10);
  391.       SetCaretPos(PaintGetColPos(),PaintGetRowPos());
  392.       ShowCaret(hMainWnd);
  393.       break;
  394.  
  395.     case WM_KILLFOCUS:
  396.       DestroyCaret();
  397.       break;
  398.  
  399.     case WM_PAINT:
  400.       HideCaret(hMainWnd);
  401.       hDC = BeginPaint(hMainWnd, &ps);
  402.       SetMapMode(hDC,MM_ANISOTROPIC);
  403.       SelectObject(hDC, GetStockObject(OEM_FIXED_FONT) );
  404.       PaintMain(hDC,&ps);
  405.       EndPaint(hMainWnd,&ps);
  406.       SetCaretPos(PaintGetColPos(),PaintGetRowPos());
  407.       ShowCaret(hMainWnd);
  408.       break;
  409.  
  410.     case WM_DESTROY:
  411.       GoOffLine(ThePort);
  412.       if(idTimer) KillTimer(hMainWnd,idTimer);
  413.       PostQuitMessage(0);
  414.       break;
  415.  
  416.     default:
  417.       return (DefWindowProc(hMainWnd, iMsg, wParam, lParam));
  418.    }
  419.  return 0;
  420. } /* end MainWndProc */
  421.  
  422. void ErrorCheck(int Code)
  423. {/* trap PCL error codes */
  424.  if(Code<0)
  425.     {SioError(Code,"Sio Error");
  426.      SioDone(GetPort());
  427.      FatalFlag = TRUE;
  428.     }
  429. }
  430.  
  431. void ErrorMessage(char *MsgPtr)
  432. {
  433.  MessageBox(hMainWnd,MsgPtr,"ERROR",MB_ICONEXCLAMATION | MB_OK);
  434. }
  435.  
  436.